﻿/**********************************************************************************
 * Project Name   :   
 * Remarks        :  
 * Interface Name :  IAssertInstance   
 * Version        :  v1.0.0.0 
 * Author         :  Joey Liang 
 * Description    : 
 * Created Time   :  2013/10/16 21:38:37
 * Update Man     :  Joey Liang
 * Update Time    :  2013/10/16 21:38:37
************************************************************************/

using System;
using System.Collections;

namespace IdleTest
{
    /// <summary>
    /// 单元测试断言接口，用以实现测试框架的可替换性，当更换测试框架时，必须实现本接口，
    /// 然后修改AssertCommon类的DEFAULT_INSTANCE值为实现本接口的新类即可
    /// </summary>
    public interface IAssertInstance
    {
        /// <summary>
        /// 断言使用相等运算符验证指定的两个泛型数据是否相等。
        /// </summary>
        /// <typeparam name="T">类型参数</typeparam>
        /// <param name="expected">要比较的第一个泛型类型数据。 这是单元测试要求的泛型类型数据。</param>
        /// <param name="actual">要比较的第二个泛型类型数据。 这是单元测试生成的泛型类型数据。</param>
        /// <param name="areEqual">断言是否相等</param>
        /// <param name="compareFunc">用于判断两个复杂对象相等的委托</param>
        /// <param name="message">断言失败的提示信息</param>
        void AreEqual<T>(T expected, T actual, bool areEqual = true, Func<T, T, bool> compareFunc = null, string message = null);

        /// <summary>
        /// 断言两个集合数据是否相等。
        /// </summary>
        /// <param name="expected">要比较的第一个集合。 这是单元测试要求的集合数据。</param>
        /// <param name="actual">要比较的第二个集合。 这是单元测试生成的集合数据。</param>
        /// <param name="areEqual">断言是否相等</param>
        /// <param name="comparer">用于比较两个集合的接口类型，使用系统提供的对比方式则传null</param>
        /// <param name="message">断言失败的提示信息</param>
        void AreEqual(ICollection expected, ICollection actual, IComparer comparer, bool areEqual = true, string message = null);

        /// <summary>
        /// 断言指定的值为true或false
        /// </summary>
        /// <param name="actual">实际结果值</param>
        /// <param name="isTrue">是否为true</param>
        /// <param name="message">断言失败的提示信息</param>
        void IsBoolean(bool actual, bool isTrue = true, string message = null);

        /// <summary>
        /// 断言调用一个函数是否抛出异常
        /// </summary>
        /// <param name="action">调用函数的无参数Action</param>
        /// <param name="hasThrow">是否抛出异常</param>
        /// <param name="message">断言失败的提示信息</param>
        void ThrowException(Action action, bool hasThrow = true, string message = null);

        /// <summary>
        /// 断言调用一个函数抛出异常的类型
        /// </summary>
        /// <typeparam name="T">预期抛出的异常类型</typeparam>
        /// <param name="action">调用函数的无参数Action</param>
        /// <param name="hasThrow">是否抛出异常</param>
        /// <param name="message">断言失败的提示信息</param>
        void ThrowException<T>(Action action, bool hasThrow = true, string message = null) 
            where T : Exception;

        /// <summary>
        /// 断言为null
        /// </summary>
        /// <param name="actual">需要断言的对象</param>
        /// <param name="isNull">是否断言为空</param>
        /// <param name="message">断言失败的提示信息</param>
        void IsNull<T>(T actual, bool isNull = true, string message = null);

        /// <summary>
        /// 断言为空或null
        /// </summary>
        /// <typeparam name="T">类型参数</typeparam>
        /// <param name="actual">实际值</param>
        /// <param name="isEmpty">是否断言为空</param>
        /// <param name="message">断言失败的提示信息</param>
        void IsEmpty<T>(T actual, bool isEmpty = true, string message = null);

        /// <summary>
        /// 断言是否是某一类型
        /// </summary>
        /// <param name="expectedType">预期类型</param>
        /// <param name="actual">需要断言的对象</param>
        /// <param name="isInstance">断言是否是expectedType类型</param>
        /// <param name="message">断言失败的提示信息</param>
        void IsInstance(Type expectedType, object actual, bool isInstance = true, string message = null);

        /// <summary>
        /// 断言失败
        /// </summary>
        /// <param name="message">断言失败的提示信息</param>
        void Fail(string message = null);
    }
}
